结构型-代理模式

概念

Proxy Pattern:为某个对象提供一个代理,并由这个代理对象控制对原有对象的访问。

消息队列就是这种模式

img

使用

ES6提供了Proxy构造函数能够让我们轻松地使用代理模式

var proxy = new Proxy(target, handler);

  • new Proxy()表示生成一个Proxy实例
  • target参数表示所有拦截的目标对象
  • handler参数也是一个对象,用来定制拦截行为
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var target = {
name: 'wei'
}
var logHandler = {
get: function(target, key) {
console.log(`${key} 被读取`);
return target[key];
},
set:function(target, key, value) {
console.log(`${key} 被设置为 ${value}`);
target[key] = value;
}
}
var targetWithLog = new Proxy(target, logHandler);

targetWithLog.name; // name 被读取
targetWithLog.name = 'zhang'; // name 被设置为 zhang
console.log(target.name); // zhang

优点

  • 降低了系统的耦合度

  • 不同类型的代理可以让客户端对目标对象的访问进行不同的控制:

    • 远程代理:让客户端可以访问在远程对象上的对象。远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求
    • 虚拟代理:通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度
    • 保护代理:可以控制客户端对真实对象的使用权限

缺点

  • 由于增加了代理对象,可能会让客户端请求的速度变慢